package com.wn.service.impl;

import com.wn.entity.Article;
import com.wn.mapper.ArticleMapper;
import com.wn.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * @Service
 * 1、创建对象加入容器，加入容器中的对象名称默认是类名首字母小写
 * 2、与@Compoment功能一样，只是@Service标注业务层对象
 * @Scope
 * 1、表示对象的作用域
 * 2、默认是singleton单例
 * 3、ioc容器创建，默认会创建单例的对象（作用域）
 * 4、作用域
 *   singleton  单例
 *   prototype  多例（每次使用时候都创建）
 *   request    对象会绑定到request请求域；请求结束对象回收。
 *   session    对象的作用域与session会话域一致
 *   globalsession 全局会话域；集群环境使用
 *
 * @Lazy
 * 1、只对单例的对象有效；
 * 2、单例的对象创建容器时候就创建，以后在用，只是从容器中获取
 * 3、一旦单例的对象加上了@Lazy注解，表示对象延迟创建；
 *    * 创建容器时候不创建单例的对象
 *    * 在第一次使用时候创建
 * 4、场景？ 对一些不常用的工具类，可以延迟创建。
 */

/**
 * @Transactional
 * 1、事务注解
 * 2、位置
 *    2.1 可以在类上定义，表示当前类的所有方法都自动应用Spring声明式事务
 *    2.2 也可以定义到方法上，当前方法应用事务；
 *    2.3 也可以定义到接口上，表示所有实现该接口的实现类都会自动应用事务
 * 3、属性
 *    isolation 指定事务隔离级别
 *          REPEATABLE_READ 可重复读；MySQL默认
 *    timeout 事务执行的超时时间；默认-1表示不指定。
 *    readOnly 是否是只读的事务，默认是false，表示支持crud操作
 *             true 表示查询操作
 *    rollbackFor 指示哪些异常类型必须导致事务回滚。
 *    propagation 事务传播行为；控制如何管理应用事务
 *      REQUIRED 表示当前执行方法必须有事务环境；
 *               如果没有事务，就创建一个新的事务；
 *               如果当前运行方法有事务管理，则加入到当前事务中
 *               应用：增删改
 *      REQUIRES_NEW  表示当前执行方法必须有事务环境；
 *                    不管当前方法是否有事务环境，都创建一个【新的】事务。
 *                    应用：增删改
 *      SUPPORTS  当前运行方法的传播行为是SUPPORTS表示，可以以事务的方式或非事务的方式运行都可以。
 *                应用： 查询！
 *      NEVER     以非事务方式执行，如果存在事务则抛出异常。
 */
@Service
@Transactional(
        isolation = Isolation.REPEATABLE_READ,
        timeout = -1,
        readOnly = false,
        rollbackFor = NullPointerException.class,
        propagation = Propagation.NEVER
)
public class ArticleServiceImpl implements ArticleService {

    /**
     * @Autowired 自动注入；自动去容器中找相同类型的对象赋值给字段
     */
    @Autowired
    private ArticleMapper articleMapper;

    @PostConstruct  // 创建对象之后执行
    public void init(){

    }

    @Override
    public Article findById(Integer id) {
        return articleMapper.findById(id);
    }


    @Override
    public List<Article> findAll() {
        return articleMapper.findAll();
    }

    @Override
    public void save(Article article) {
        articleMapper.save(article);
        int i = 1/0;
        articleMapper.save(article);
    }

    @Override
    public void update(Article article) {
        articleMapper.update(article);
    }

    @Override
    public void delete(Integer id) {
        articleMapper.delete(id);
    }

    @Override
    public void delBatch(List<Integer> ids) {
        articleMapper.delBatch(ids);
    }
}
